
#include "objeto.h"
#include "motor.h"
#include <btBulletDynamicsCommon.h>

namespace Fisica {

Objeto::Objeto(btCollisionShape &forma, float x, float y, float z, float masa) :
   forma(0), estado(0), cuerpo(0) {

   btTransform transformacion;
   transformacion.setIdentity();
   transformacion.setOrigin(btVector3(x, y, z));

   estado = new btDefaultMotionState(transformacion);

   construirCon(forma, masa);
}

Objeto::Objeto(float x, float y, float z) :
   forma(0), estado(0), cuerpo(0) {

   btTransform transformacion;
   transformacion.setIdentity();
   transformacion.setOrigin(btVector3(x, y, z));

   estado = new btDefaultMotionState(transformacion);
}

void Objeto::construirCon(btCollisionShape &forma, float masa) {
   assert(this->forma == 0);
   assert(this->cuerpo == 0);

   this->forma = &forma;

   btVector3 inercia(0,0,0);
   if(masa) this->forma->calculateLocalInertia(masa, inercia);

   btRigidBody::btRigidBodyConstructionInfo info(masa, estado, this->forma, inercia);
   cuerpo = new btRigidBody(info);

   MotorFisico::getMotor()->agregar(cuerpo);
}

void Objeto::inicializarDesde(btRigidBody &objetoConstruido) {
   forma = objetoConstruido.getCollisionShape();
   estado = objetoConstruido.getMotionState();
   cuerpo = &objetoConstruido;

   MotorFisico::getMotor()->agregar(cuerpo);
}


void Objeto::desactivar() {
   cuerpo->setActivationState(DISABLE_DEACTIVATION);
}

btRigidBody* Objeto::cuerpoRigido() {
   return cuerpo;
}


Objeto::~Objeto() {
   if(cuerpo) 
      MotorFisico::getMotor()->remover(cuerpo);
   
   delete cuerpo;
   delete estado;
   delete forma;
}

void Objeto::transformacion(float matrix[16]) const {
   btTransform t;
   estado->getWorldTransform(t);
   t.getOpenGLMatrix(matrix);
}

void Objeto::setTransformacion(const float matrix[16]) {
   btTransform t;
   t.setFromOpenGLMatrix(matrix);
   estado->setWorldTransform(t);
}

}
